﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

//int main()
//{
//	int arr[10] = { 0 };
//	int* p =(int *) malloc(40);
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	// Use the memory
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		*(p + i) = i;
//	}
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d\n", *(p + i));
//	}
//
//	free(p);
//	p = NULL;
//	return 0;
//}
//int main()
//{
//	int* p = (int*) calloc(10, 4);
//	int i = 0;
//
//	if (NULL == p)
//	{
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//
//	/*for (i = 0; i < 10; i++)
//	{
//		*(p + i) = i;
//	}*/
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d\n", *(p + i));
//	}
//	free(p);
//	p = NULL;
//	return 0;
//}
//int main()
//{
//	int* p = (int*) malloc(40);
//	
//	if (NULL == p)
//	{
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		*(p + i) = i;
//	}
//
//	int *q = (int*) realloc(p, 8000);
//	if (q != NULL)
//	{
//		p = q;
//	}
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d\n", *(p + i));
//	}
//
//	free(p);
//	p = NULL;
//
//	// Neomu bukjaphae????? 
//	// 内存池？？？？
//	return 0;
//}
//int main()
//{
//	int* p = (int*)malloc(40);
//	if (NULL == p)
//	{
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//
//	int i = 0;
//	for (i = 0; i <= 10; i++)
//	{
//		p[i] = i;
//	}
//
//	free(p);
//	p = NULL;
//	return 0;
//}
//int main()
//{
//	int a = 10;
//	int* p = &a;
//
//	free(p);
//	p = NULL;
//	return 0;
//}
//int main()
//{
//	int* p = (int*)malloc(40);
//	if (NULL == p)
//	{
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		*p = i;
//		p++;
//	}
//	
//	free(p);
//	p = NULL;
//
//	return 0;
//}
//int main()
//{
//	int* p = (int*)malloc(40);
//	if (NULL == p)
//	{
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//
//	
//	free(p);  // Release을 하지않으면 안 돼요!!!!!
//	
//	return 0;
//}
//void GetMemory(char* p)
//{
//	p = (char*)malloc(100);
//}
//
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(str);
//	strcpy(str, "hello world");
//	printf("%d\n", str);
//}
//
//short main()
//{
//	char* str = "roge";
//	printf(str);    // The new yongbeop of printf!!!!!
//	// 不能对NULL 解引用！！！！！！
//
//	return 0;
//}
//void Test(void)
//{
//	char* str = (char*)malloc(100);
//	strcpy(str, 100);
//	free(str);
//	// It turn into a wild dog.........
//	str = NULL;
//	if (str != NULL)
//	{
//		strcpy(str, "world");
//		printf(str);
//	}
//}
//
//int main()
//{
//	Test();
//	return 0;
//}
//int main()
//{
//	int n = 0;
//	int m = 0;
//	while (scanf("%d %d",&n,&m)==2)
//	{
//		long i = m;
//		long j = n;
//		long r = 0;
//		while (r = i%j)
//		{
//			i = j;
//			j = r;
//		}
//		printf("%ld\n", m * n / j + j);
//	}	
//	// 辗转相除法的最大公约数，然后÷m*n直接最小公倍数？？？？？？？？？
//	return 0;
//}
//int main()
//{
//	int row = 0;
//	scanf("%d", &row);
//	scanf("%d", &row);
//	while (scanf("%d",&row))
//	{
//		int i = 0;
//		int j = 0;
//		for (i = 0; i < row; i++)
//		{
//			if (0 == i || i == row - 1)
//			{
//				for (j = 0; j < row; j++)		printf("* ");
//			}
//			else
//			{
//				printf("* ");
//				for (j = 0; j < row - 2; j++)	printf("  ");
//				printf("* ");
//			}
//			printf("\n");
//		}
//	}
//	return 0;
//}
//
//typedef struct
//{
//	int a;
//	int arr[];
//}Goat;
//int main()
//{
//	Goat * p =(Goat*) malloc(sizeof(Goat)+40);
//	if (NULL == p)
//	{
//		printf("%s\n", strerror(errno));
//	}
//	p->a = 100;
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		p->arr[i] = i;
//	}
//	for (i = 0; i < 10; i ++ );
//	{
//		printf("%d\n", p->arr[i]);
//	}
//	free(p);
//	p = NULL;
//	return 0;
//}

struct S
{
	int a;
	int* arr;
};

int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	if (NULL == ps)
	{
		//printf("%s\n", strerror(errno));
		return 1;
	}
	ps->a = 100;
	ps->arr =(int *)malloc(40);

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", ps->arr[i]);
	}

	int * ptr = (int *)realloc(ps->arr,80);

	free(ps->arr);
	free(ps);
	ps = NULL;
	// 柔性数组一次就搞定，但指针则需要free两次， 一共四次啊！！！！
	// 柔性数组防止产生内存碎片？？？？？
	// 可以提高访问速度！！！！
	return 0;
}